package com.joker.cart.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.joker.cart.mapper.CartItemMapper;
import com.joker.cart.service.CartService;
import com.joker.cart.vo.CartItemVo;
import com.joker.cart.vo.CartRequest;
import com.joker.cart.vo.CartVo;
import com.joker.common.core.text.Convert;
import com.joker.common.core.utils.StringUtils;
import com.joker.common.core.utils.bean.BeanUtils;
import com.joker.common.redis.service.RedisService;
import com.joker.common.security.utils.SecurityUtils;
import com.joker.system.common.model.LoginUser;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class CartServiceImpl implements CartService {

    @Resource
    private RedisService redisService;
    @Resource
    private CartItemMapper cartItemMapper;

    private final String CART_ITEM = "cart:";

    /**
     * 添加购物车
     *
     * @param cartRequest
     */
    @Override
    public void addCartItem(CartRequest cartRequest) {
        LoginUser loginUser = SecurityUtils.getLoginUser();

//        LoginUser loginUser = new LoginUser();
        loginUser.setUserid(loginUser.getUserid());

        String key = CART_ITEM+loginUser.getUserid();

        CartVo cartVo = cartItemMapper.selectskuIdCartVo(cartRequest.getSkuId());

        String skuAttr = cartItemMapper.selectCartVoAttr(cartRequest.getSkuId());

        cartVo.setUserId(loginUser.getUserid());

        List<CartVo> carts = cartItemMapper.selectCart();

        //卖家是否存在
        cartIsExist(carts,cartVo);

        //购物车商品信息
        cartVo.getCartItemVoList().forEach(cartItemVo -> {
            cartItemVo.setCartId(cartVo.getId());

            cartItemVo.setSkuId(cartRequest.getSkuId());

            cartItemVo.setSkuAttr(skuAttr);

            cartItemVo.setCartItemChecked(1);

            cartItemVo.setCartItemNum(cartRequest.getNum());

            cartItemVo.setSellerId(cartVo.getSellerId());

            cartItemVo.setSellerName(cartVo.getSellerName());
        });

        cartVo.getCartItemVoList().forEach(cartItemVo -> {

            //判断购物车是否存在
            if(!redisService.hasKey(key)){
                redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), cartItemVo);

                return;
            }

            if (redisService.hasKey(key)){

                CartItemVo newCartItemVo = (CartItemVo) redisService.getCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()));

                //判断商品是否已存在
                if(newCartItemVo == null){
                    redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), cartItemVo);

                    return;
                }
                if(newCartItemVo != null){
                    newCartItemVo.setCartItemNum(newCartItemVo.getCartItemNum() + cartItemVo.getCartItemNum());

                    redisService.setCacheMapValue(key, String.valueOf(cartItemVo.getSkuId()), newCartItemVo);
                }
            }
        });
    }
    /**
     * 查询购物车
     *
     * @return
     */
    @Override
    public List<CartVo> cartVoList() {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        Long userid = loginUser.getUserid();
        //从redis中取出所有的数据
        Map<String, Object> cacheMap = redisService.getCacheMap(CART_ITEM+userid);
        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(cacheMap));
        Set<String> keys = jsonObject.keySet();
        List<CartItemVo> cartItemVoList = new ArrayList<>();
        for (String key : keys) {
            CartItemVo cartItemVo = jsonObject.getObject(key, CartItemVo.class);
            cartItemVoList.add(cartItemVo);
        }
        List<CartVo> cartVos = new ArrayList<>();
        List<CartVo> cartVoList = convertToListOfCartVo(cartItemVoList);
        cartVoList.forEach(cartVo->{
            System.out.println(cartVo.getSellerId());
            cartVo.getCartItemVoList().forEach(item->{
                System.out.println(item.getCartItemNum());
            });
            cartVos.add(cartVo);
        });

        return cartVoList;
    }

    public static List<CartVo> convertToListOfCartVo(List<CartItemVo> cartItemList) {
        // 使用 Stream API 按 sellerId 分组
        Map<Long, List<CartItemVo>> groupedBySellerId = cartItemList.stream()
                .collect(Collectors.groupingBy(CartItemVo::getSellerId));

        // 创建 CartVo 列表
        List<CartVo> cartVoList = new ArrayList<>();

        // 遍历分组后的 Map，创建 CartVo 对象
        for (Map.Entry<Long, List<CartItemVo>> entry : groupedBySellerId.entrySet()) {
            Long sellerId = entry.getKey();
            List<CartItemVo> items = entry.getValue();

            // 假设 CartItem 中有方法 getSellerName() 可以获取 sellerName（如果没有，则需要调整逻辑）
            // 这里我们取第一个 CartItem 的 sellerName 作为该 sellerId 下的 sellerName（可能需要根据实际需求调整）
            String sellerName = items.get(0).getSellerName(); // 注意：这里可能不是最佳实践，因为可能不是所有 CartItem 的 sellerName 都相同

            // 创建 CartVo 对象并添加到列表中
            CartVo cartVo = new CartVo();
            cartVo.setSellerId(sellerId);
            cartVo.setSellerName(sellerName);
            cartVo.setCartItemVoList(items);

            cartVoList.add(cartVo);
        }

        return cartVoList;
    }
    @Override
    public void deleteCartItem(String skuIds) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        String key = CART_ITEM + loginUser.getUserid();
        //分割删除的skuId
        String[] skuIdList = Convert.toStrArray(skuIds);
        for (String skuId : skuIdList) {
            redisService.deleteCacheMapValue(key, String.valueOf(skuId));
        }

    }

//    @Override
//    public List<CartVo> cartVoList() {
//        LoginUser loginUser = SecurityUtils.getLoginUser();
//
//        String key = CART_ITEM+loginUser.getUserid();
//
//        Map<String, CartItemVo> map = redisService.getCacheMap(key);
//
//        List<CartVo> cartVos = new ArrayList<>();
//
//
//        CartVo cartVo = new CartVo();
//
//        List<CartItemVo> cartItemVoList = new ArrayList<>();
//
//        map.forEach((k, v) -> {
//
//            CartItemVo cartItemVo = new CartItemVo();
//
//            BeanUtils.copyProperties(v, cartItemVo);
//
//            cartItemVoList.add(cartItemVo);
//
//            Long cartId = v.getCartId();
//
//            CartVo newCartVo = cartItemMapper.selectCartId(cartId);
//            if (newCartVo !=null){
//                BeanUtils.copyProperties(newCartVo, cartVo);
//            }
//
//
//        });
//
//        cartVos.add(cartVo);
//
//        cartVo.setCartItemVoList(cartItemVoList);
//
//        return cartVos;
//    }


    /**
     * 卖家是否存在
     */
    private void cartIsExist(List<CartVo> carts, CartVo cartVo) {
        carts.forEach(cart -> {

            if(StringUtils.isNull(cart.getUserId())){

                if(StringUtils.isNull(cart.getSellerId())){

                    cartItemMapper.addCart(cartVo);
                    return;

                }
            }


              if(!cart.getUserId().equals(cartVo.getUserId())){

                  if(!cart.getSellerId().equals(cartVo.getSellerId())){

                      cartItemMapper.addCart(cartVo);

                  }

              }

              if(cart.getUserId().equals(cartVo.getUserId())){

             if(cart.getSellerId().equals(cartVo.getSellerId())){

                 CartVo newCart = cartItemMapper.selectCartUserId2SellerId(cartVo);

                 cartVo.setId(newCart.getId());

             }

         }


        });
    }
}
